/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.common.query;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.io.Serial;

/**
 * 查询列表的查询参数
 *
 * @author 挺好的 2023年05月30日 15:35
 */
@Data
@EqualsAndHashCode (callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class Listable extends BaseQueryable {

    @Serial
    private static final long serialVersionUID = 8191531385101133395L;

    /**
     * 默认从第0条开始
     */
    public static final int DEFAULT_FIRST = 0;

    /**
     * 最大每次展示50条数据
     */
    public static final int MAX_COUNT = 50;

    /**
     * 限制从第几条开始的最大数量，默认50，避免客户端传递任意数据，造成数据库负担
     */
    public static final int MAX_FIRST_VALUE = MAX_COUNT;

    /**
     * 从第几条开始显示
     */
    private Integer first;

    /**
     * 显示多少条
     */
    private Integer count;


    /**
     * 设置first，如果<1，从0开始，为null，则不进行任何操作。
     * 该方法会重置first的开始位置为0，如果first<1 || first > {@link Listable#MAX_FIRST_VALUE}
     */
    public Integer resetFirst () {
        if (this.first == null) {
            return null;
        }
        // 小于1或者大于 MAX_FIRST_VALUE，都从0开始
        if (this.first < 1 || this.first > MAX_FIRST_VALUE) {
            this.first = DEFAULT_FIRST;
        }
        return this.first;
    }

    /**
     * 设置count，如果为空，不进行任何操作。 count < 1,设置count=1，count  > MAX_COUNT，设置count=MAX_COUNT
     */
    public Integer resetCount () {
        if (this.count == null) {
            return null;
        }
        if (this.count < 1) {
            this.count = 1;
        }
        if (this.count > MAX_COUNT) {
            this.count = MAX_COUNT;
        }

        return this.count;
    }
}
